package com.liming.auth.client;

import com.liming.common.pojo.dto.authinfo.AdminAddOrUpdateDTO;
import com.liming.common.pojo.dto.authinfo.AdminLoginDTO;
import com.liming.common.pojo.dto.authinfo.UserPageQuery;
import com.liming.common.pojo.entity.authinfo.Region;
import com.liming.common.pojo.vo.PageVO;
import com.liming.common.pojo.vo.authinfo.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author liming
 * @date 2025/1/14
 */
@FeignClient(value = "auth-service", contextId = "adminAuthClient", path = "/service/admin_auth_info")
public interface AdminAuthClient {

    /**
     * 管理员姓名和手机号
     *
     * @param id 管理员ID
     * @return 管理员姓名和手机号
     */
    @GetMapping(value = "getNameAndPhone/{id}")
    String getNameAndPhone(@PathVariable Long id);

    /**
     * 管理员信息列表
     *
     * @return 管理员信息列表
     */
    @GetMapping(value = "list")
    List<AdminVO> list();

    /**
     * 管理员权限信息
     *
     * @return 管理员权限信息
     */
    @GetMapping(value = "auth")
    AdminAuthVO auth();

    /**
     * 获取角色列表
     *
     * @return 角色列表
     */
    @GetMapping(value = "roleList")
    List<RoleVO> roleList();

    /**
     * 权限列表
     *
     * @return 权限列表
     */
    @GetMapping(value = "permissionList")
    List<PermissionVO> permissionList();

    /**
     * 获取管理员对应角色列表
     *
     * @param adminId 管理员ID
     * @return 管理员对应角色列表
     */
    @GetMapping(value = "adminRole/{adminId}")
    List<RoleVO> adminRoleList(@PathVariable Long adminId);

    /**
     * 获取角色对应权限列表
     *
     * @param roleId 角色ID
     * @return 角色对应权限列表
     */
    @GetMapping(value = "rolePermission/{roleId}")
    List<PermissionVO> rolePermissionList(@PathVariable Long roleId);

    /**
     * 获取地区列表
     *
     * @return 地区列表
     */
    @GetMapping(value = "regionList")
    List<Region> regionList(@RequestParam Long parentId, @RequestParam Integer level);

    /**
     * 用户分页列表
     *
     * @param query 查询参数
     * @return 用户分页列表
     */
    @GetMapping(value = "userPage")
    PageVO<UserVO> userPage(@SpringQueryMap UserPageQuery query);

    /**
     * 管理员登出
     *
     * @return 是否登出成功
     */
    @PostMapping(value = "logout")
    Boolean logout();

    /**
     * 管理员登录
     *
     * @param adminLoginDTO 管理员登录信息
     * @return Token
     */
    @PostMapping(value = "login", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    AdminLoginVO login(AdminLoginDTO adminLoginDTO);

    /**
     * 添加角色
     *
     * @param roleName 角色名
     * @return 是否添加成功
     */
    @PostMapping(value = "role")
    Boolean role(@RequestParam String roleName);

    /**
     * 添加权限
     *
     * @param name        权限名
     * @param description 权限描述
     * @return 是否添加成功
     */
    @PostMapping(value = "permission")
    Boolean permission(@RequestParam String name, @RequestParam String description);

    /**
     * 添加管理员角色
     *
     * @param adminId 管理员ID
     * @param roleIds 角色IDS
     * @return 是否添加成功
     */
    @PostMapping(value = "adminRole/{adminId}")
    Boolean adminRole(@PathVariable Long adminId, List<Long> roleIds);

    /**
     * 添加角色权限
     *
     * @param roleId        角色ID
     * @param permissionIds 权限IDS
     * @return 是否添加成功
     */
    @PostMapping(value = "rolePermission/{roleId}")
    Boolean rolePermission(@PathVariable Long roleId, List<Long> permissionIds);

    /**
     * 新增管理员
     *
     * @param adminAddOrUpdateDTO 管理员信息
     * @return 是否新增成功
     */
    @PostMapping
    Boolean addInfo(@RequestBody AdminAddOrUpdateDTO adminAddOrUpdateDTO);

    /**
     * 更新管理员信息
     *
     * @param adminAddOrUpdateDTO 管理员信息
     * @return 是否更新成功
     */
    @PutMapping
    Boolean updateInfo(@RequestBody AdminAddOrUpdateDTO adminAddOrUpdateDTO);

    /**
     * 更新管理员账号状态
     *
     * @param id 管理员ID
     * @return 是否更新成功
     */
    @PutMapping(value = "locked/{id}")
    Boolean updateStatus(@PathVariable Long id);

    /**
     * 更新用户锁定状态
     *
     * @param id 用户id
     * @return 是否更新成功
     */
    @PutMapping("userLocked/{id}")
    Boolean updateUserLocked(@PathVariable Long id);

    /**
     * 更新用户激活状态
     *
     * @param id 用户id
     * @return 是否更新成功
     */
    @PutMapping("updateUserActive/{id}")
    Boolean updateUserActive(@PathVariable Long id);

    /**
     * 删除管理员
     *
     * @param id 管理员ID
     * @return 是否删除成功
     */
    @DeleteMapping("{id}")
    Boolean delete(@PathVariable Long id);

    /**
     * 删除角色
     *
     * @param id 角色ID
     * @return 是否删除成功
     */
    @DeleteMapping("deleteRole/{id}")
    Boolean deleteRole(@PathVariable Long id);

    /**
     * 删除权限
     *
     * @param id 权限ID
     * @return 是否删除成功
     */
    @DeleteMapping("deletePermission/{id}")
    Boolean deletePermission(@PathVariable Long id);
}
